package heima_bixiangdong.test.review2;

/**
 * @DESCRIPTION: 懒汉式单例模式：优点：可以做到对象的延迟加载；缺点：多线程并发访问不安全
 * @USER: shg
 * @DATE: 2022/11/26 13:49
 */
public class LazySingleton {

    private LazySingleton() {
    }

    public static LazySingleton LAZYSINGLETON = null;

    /**
     * 最原始的获取懒汉式单例模式的写法---多线程并发访问会有线程安全问题
     *
     * @return
     */
    public static LazySingleton getInstance() {
        if (LAZYSINGLETON == null) {
            LAZYSINGLETON = new LazySingleton();
        }
        return LAZYSINGLETON;
    }

    /**
     * 改进方案一 --- 在获取懒汉式单例模式的方法上加锁(但是这样做效率变低了)
     *
     * @return
     */
    public static synchronized LazySingleton getInstance_1() {
        if (LAZYSINGLETON == null) {
            LAZYSINGLETON = new LazySingleton();
        }
        return LAZYSINGLETON;
    }

    /**
     * 改进方案二 --- 在获取懒汉式单例模式的方法上加锁(解决方案一中，效率变低的问题，减少锁的判断次数)
     *
     * @return
     */
    public static LazySingleton getInstance_2() {
        if (LAZYSINGLETON == null) {
            synchronized (LazySingleton.class) {
                if (LAZYSINGLETON == null) {
                    LAZYSINGLETON = new LazySingleton();
                }
            }
        }
        return LAZYSINGLETON;
    }



}
